#ifndef __UDP_IP_LIST_PARSER_H__
#define __UDP_IP_LIST_PARSER_H__

#include <string>
#include <fstream>
#include <boost/filesystem.hpp>
#include <boost/lexical_cast.hpp>

#include "UdpIpList.h"


/**
 * Parseur de contenu decrivant une liste d'adresse IP avec nom d'hote et port,
 * pour l'UDP.
 *
 * @author Benoit FLEURY
 */
class UdpIpListParser
{
public:

	/**
	 * Lire le fichier au chemin donne pour en extraire une liste d'IPs.
	 *
	 * @param OutputIterator Type de l'iterateur de sortie.
	 * @param filePathStr Chemin vers le fichier a lire.
	 * @param outputIte Iterateur dans lequel envoyer chaque IP lue.
	 */
	template<class OutputIterator>
	void parse_file(const std::string& filePathStr, OutputIterator outputIte) const
	{
		namespace fs = boost::filesystem;
		namespace ip = boost::asio::ip;

		fs::path filePath(filePathStr);

		/* Ne rien faire si le chemin mene a un fichier invalide. */
		if (!fs::exists(filePath) || !fs::is_regular_file(filePath))
			return;

		std::ifstream fileStream(filePathStr);
		std::string ipLine, hostStr, portStr;
		size_t ipSepPos;

		/* Lire chaque ligne du fichier. */
		while (!getline(fileStream, ipLine).fail())
		{
			ipSepPos = ipLine.find_first_of(':');
			
			/* Passer les IP sans numero de port. */
			if (ipSepPos == std::string::npos)
				continue;

			/* Extraire l'adresse et le numero de port. */
			hostStr = ipLine.substr(0, ipSepPos);
			portStr = ipLine.substr(ipSepPos+1);

			/* Ecrire l'IP dans l'iterateur de sortie. */
			outputIte = ip::udp::endpoint(
				ip::address_v4::from_string(hostStr),
				boost::lexical_cast<unsigned short>(portStr));
		}
	}
};


#endif // __UDP_IP_LIST_PARSER_H__
